<?php

class ListadoController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //---------------------------------//
    //             PAGINAS             //
    //---------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Reporte.Listado de Solicitudes')) return;

        try{
            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            //agregar al array un elemento que para la opcion de todos los usuarios
            $allDpts = array('codigoDepartamento'=>0, 'nombreDepartamento'=>'Todos');
            array_unshift($departamentos, $allDpts);

            // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }


    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Reporte.Listado de Solicitudes')) return;

        try{
            // obtener los parametros
            $fechaIni   = $this->_request->getPost('filtroInicial');
            $fechaFin   = $this->_request->getPost('filtroFinal');
            $total      = $this->_request->getPost('total');
            $filtroDepartamento = $this->_request->getPost("codigoDepartamento");
            $filtroSolicitud    = $this->_request->getPost("TipoSol");
            $filtroEstado       = $this->_request->getPost("EstadoSol");

            // fijar cota de fechas y horas para el retrieve de datos
            $fechaIni  = str_replace(        'T',         ' ', $fechaIni);
            $fechaFin    = str_replace('T00:00:00', ' 23:59:59', $fechaFin  );

            // crear el where para filtrar
            $filtroFecha = ($fechaIni && $fechaFin? "s.fechaSolicitud >= '$fechaIni' and s.fechaSolicitud <= '$fechaFin'"
                         : ($fechaIni                ? "s.fechaSolicitud >= '$fechaIni'"
                         : ($fechaFin                  ? "s.fechaSolicitud <= '$fechaFin'"
                         : '')));
            $filtroDepartamento = ($filtroDepartamento!=0 ? "d.codigoDepartamento = '$filtroDepartamento'" : '1=1');
            $filtroSolicitud = ($filtroSolicitud!=0 ? "s.tipoSolicitud = '$filtroSolicitud'" : '1=1');
            $filtroEstado = ($filtroEstado!=0 ? "s.estadoSolicitud = '$filtroEstado'" : '1=1');

            // obtener los datos
            $rows = $this->em->createQueryBuilder()
                ->select    ('s.numeroSolicitud')
                ->addselect ('s.observaciones')
                ->addselect ('s.monto')
                ->addselect ('s.estadoSolicitud')
                ->addselect ('s.fechaSolicitud')
                ->addselect ('s.tipoSolicitud')
                ->addselect ('s.chequeOrden')
                ->addSelect ('d.codigoDepartamento')
                ->addSelect ('d.nombreDepartamento')
                ->from      ('Default_Model_Solicitud',  's')
                ->leftjoin  ('s.usuario',                'u')
                ->leftjoin  ('u.departamento',           'd')
                ->where     ($filtroFecha)
                ->andWhere  ($filtroEstado)
                ->andWhere  ($filtroSolicitud)
                ->andWhere  ($filtroDepartamento)
                ->getQuery  ()
                ->execute   ();

            // Para mapear el valor entero a su nombre correspondiente
		$i=0;
		$tot= count($rows);
		while ( $i < $tot ){

		    if( $rows[$i]['tipoSolicitud']==1 )
			$rows[$i]['tipoSolicitud']='Reembolso de Caja Chica';
		    if( $rows[$i]['tipoSolicitud']==2 )
			$rows[$i]['tipoSolicitud']='Pago';

		    if( $rows[$i]['estadoSolicitud']==1 )
			$rows[$i]['estadoSolicitud']='No confirmado';
		    if( $rows[$i]['estadoSolicitud']==2 )
			$rows[$i]['estadoSolicitud']='Confirmado';
                    if( $rows[$i]['estadoSolicitud']==3 )
			$rows[$i]['estadoSolicitud']='Rechazado';

                    //fecha
                    $rows[$i]['fechaSolicitud']=substr($rows[$i]['fechaSolicitud'],8,2).'/'.
                                                substr($rows[$i]['fechaSolicitud'],5,2).'/'.
                                                substr($rows[$i]['fechaSolicitud'],0,4);


		    $i++;
		}

            // create PDF
            $pdf = new Zend_Pdf();
            // create A4 page
            $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE); //'842:595:'
            // define font resource
            $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
            $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

            $page->setFont($font2, 12)
                 ->drawText('Reporte :', 150, 560)
                 ->drawText('Fecha inicial :', 150, 540)
                 ->drawText('Fecha final :', 150, 520);
            $page->setFont($font, 12)
                 ->drawText('Listado de solicitudes', 235, 560)
                 ->drawText("$fechaIni", 235, 540)
                 ->drawText("$fechaFin", 235, 520);
                 
            $image = \Zend_Pdf_Image::imageWithPath('img/logoUCA.png');
            $page->drawImage($image, 20, 480, ($image->getPixelWidth()+20), (480+$image->getPixelHeight()));
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->drawLine(10, 465, ($page->getWidth()-10), 465);
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->drawLine(10, 445, ($page->getWidth()-10), 445);

            $page->setFont($font, 9)
                 ->drawText('Tipo',          185, 452)
                 ->drawText('Fecha',         300, 452)
                 ->drawText('Monto',         770, 452)
                 ->drawText('Estado',        240, 452)
                 ->drawText('Solicitud Nro.', 20, 452)
                 ->drawText('Departamento',   85, 452)
                 ->drawText('Observaciones', 350, 452)
                 ->drawText('A la orden de', 600, 452);

            // add page to document
            $pdf->pages[] = $page;

            $pageNumber=1;
            
            //carga del detalle del log al pdf
            $i=430;
            foreach($rows as $row){

                //si se aproxima el fin de pagina, nueva pagina
                if($i <= 90){
                    // create A4 page
                    $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE); //'842:595:'

                    // agregar pagina al pdf
                    $pdf->pages[] = $page;
                    $i=570;
                    $pageNumber++;
                }

                //si no es la primera pagino no utilizamos encabezado
                if($pageNumber>1 && $i==570){
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(10, 568, ($page->getWidth()-10), 568);
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(10, 548, ($page->getWidth()-10), 548);

                    $page->setFont($font, 9)
                        ->drawText('Tipo',          185, 555)
                        ->drawText('Fecha',         300, 555)
                        ->drawText('Monto',         770, 555)
                        ->drawText('Estado',        240, 555)
                        ->drawText('Solicitud Nro.', 20, 555)
                        ->drawText('Departamento',   85, 555)
                        ->drawText('Observaciones', 350, 555)
                        ->drawText('A la orden de', 600, 555);

                    $i=535;
                    
                }

                if(strcmp($row['tipoSolicitud'],"Pago")==0){
                    $tipo = $row['tipoSolicitud'];
                }
                else{
                    $tipo = "Reembolso";
                }

                $page->setFont($font, 7)
                     ->drawText($tipo                 ,    185, $i)
                     ->drawText($row['fechaSolicitud'],    300, $i);
                    
				$monto=number_format($row['monto'], 0,',','.');
				$montopos= 800-$this->getTextWidth($monto,$font,7);
					
                $page->setFont($font, 7)
                    ->drawText($monto, $montopos, $i)
                    ->drawText($row['estadoSolicitud'],   240, $i)
                    ->drawText($row['numeroSolicitud'],    20, $i)
                    ->drawText($row['nombreDepartamento'], 85, $i, 'UTF-8')
                    ->drawText($row['chequeOrden'],       600, $i, 'UTF-8');

                $y=$i;

                $text = wordwrap($row['observaciones'], 70);
                $token = strtok($text, "\n");
                $salto = 0;
                while ($token != false){
                    $page->setFont($font, 7)->drawText($token, 350, $y,'UTF-8');
                    $token = strtok("\n"); $y = $y-12;
                    $salto++;
                }

                if($salto>1){
                    $i=$y+12;
                }

                $i = $i-24;
                
            }
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(740, $i, 832, $i);
            $total = intval($total);
            $montopos= 810-$this->getTextWidth($total,$font2,7);
            $page->setFont($font2, 7)
                ->drawText(number_format($total, 0,',','.'), $montopos, $i-15);
            
            // Agregar numero de pagina al pie
            $pageNumber=1;
            foreach($pdf->pages as $p){
                $p->drawText($pageNumber++,  790, 40);
            }

            //Guardar el pdf
            $fileName = 'ListadoSolicitudes.pdf';
            $pdf->save($fileName);

            X\Msg::Success('El reporte se ha generado con éxito.');

        }
        catch(Exception $e){
            X\Msg::Failure('Error al generar el reporte.');
        }
    }

    public function pdfAction(){

          $pdf = Zend_Pdf::load('ListadoSolicitudes.pdf');

          $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
          $this->getResponse()->setHeader('Content-disposition', "filename=ListadoSolicitudes.pdf", true);
          $this->getResponse()->setBody($pdf->render());
     }

    public function ajaxFiltroAction()
    {
        if (X\CheckAccess::AjaxAction($this,'Reporte.Listado de Solicitudes')) return;

        try{
            // obtener los parametros
            $filtroDepartamento = $this->_request->getPost("filtroDepartamento");
            $filtroSolicitud    = $this->_request->getPost("filtroSolicitud");
            $filtroInicial      = $this->_request->getPost("filtroInicial");
            $filtroEstado       = $this->_request->getPost("filtroEstado");
            $filtroFinal        = $this->_request->getPost("filtroFinal");

           
            // fijar cota de fechas y horas para el retrieve de datos
            $filtroInicial  = str_replace(        'T',         ' ', $filtroInicial);
            $filtroFinal    = str_replace('T00:00:00', ' 23:59:59', $filtroFinal  );

            // crear el where para filtrar
            $filtroFecha = ($filtroInicial && $filtroFinal? "s.fechaSolicitud >= '$filtroInicial' and s.fechaSolicitud <= '$filtroFinal'"
                         : ($filtroInicial                ? "s.fechaSolicitud >= '$filtroInicial'"
                         : ($filtroFinal                  ? "s.fechaSolicitud <= '$filtroFinal'"
                         : '')));
            $filtroDepartamento = ($filtroDepartamento!=0 ? "d.codigoDepartamento = '$filtroDepartamento'" : '1=1');
            $filtroSolicitud = ($filtroSolicitud!=0 ? "s.tipoSolicitud = '$filtroSolicitud'" : '1=1');
            $filtroEstado = ($filtroEstado!=0 ? "s.estadoSolicitud = '$filtroEstado'" : '1=1');

            // obtener los datos
            $solicitudes = $this->em->createQueryBuilder()
                ->select    ('s.numeroSolicitud')
                ->addselect ('s.observaciones')
                ->addselect ('s.monto')
                ->addselect ('s.estadoSolicitud')
                ->addselect ('s.fechaSolicitud')
                ->addselect ('s.tipoSolicitud')
                ->addselect ('s.chequeOrden')
                ->addSelect ('d.codigoDepartamento')
                ->addSelect ('d.nombreDepartamento')
                ->from      ('Default_Model_Solicitud',  's')
                ->leftjoin  ('s.usuario',                'u')
                ->leftjoin  ('u.departamento',           'd')
                ->where     ($filtroFecha)
                ->andWhere  ($filtroEstado)
                ->andWhere  ($filtroSolicitud)
                ->andWhere  ($filtroDepartamento)
                ->getQuery  ()
                ->execute   ();

            // Para mapear el valor entero a su nombre correspondiente
		$i=0;
		$total= count($solicitudes);
		while ( $i < $total ){
                    
		    if( $solicitudes[$i]['tipoSolicitud']==1 )
			$solicitudes[$i]['tipoSolicitud']='Reembolso de Caja Chica';
		    if( $solicitudes[$i]['tipoSolicitud']==2 )
			$solicitudes[$i]['tipoSolicitud']='Pago';

		    if( $solicitudes[$i]['estadoSolicitud']==1 )
			$solicitudes[$i]['estadoSolicitud']='No confirmado';
		    if( $solicitudes[$i]['estadoSolicitud']==2 )
			$solicitudes[$i]['estadoSolicitud']='Confirmado';
                    if( $solicitudes[$i]['estadoSolicitud']==3 )
			$solicitudes[$i]['estadoSolicitud']='Rechazado';
		    $i++;
		}

             // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($solicitudes),
                "rows"    => $solicitudes
            ));
             
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los datos.'.$e->getMessage());
        }
    }

    public function getTextWidth($text, Zend_Pdf_Resource_Font $font, $font_size)
    {
	$drawing_text = iconv('', 'UTF-16BE', $text);
	$characters    = array();
	for ($i = 0; $i < strlen($drawing_text); $i++) {
		$characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]);
	}
	$glyphs        = $font->glyphNumbersForCharacters($characters);
	$widths        = $font->widthsForGlyphs($glyphs);
	$text_width   = (array_sum($widths) / $font->getUnitsPerEm()) * $font_size;
	return $text_width;
    }
}
